let { getDate } = require('../tools/timer')
let { createFile, fileIsExist, appendMessage, getUserHistoryMessages } = require('../data/index')
let socketServer = (io) => {
    let count = 0;
    let userlist = []   //记录在线用户
    let messageList = []   //缓存未被接收的聊天记录
    // 监听客户端连接
    io.on('connection', function (socket) {
        // socket链接后随机生成的id
        count++;
        // 接收hello
        socket.on('hello', () => {
            // 将生成的id发送给上线的人
            socket.emit('login', {
                loginTime: getDate(),
                id: socket.id,
            })
        })
        // 接收上线人的详细信息并保存
        socket.on('world', (user) => {
            let arr = userlist.filter(item => item.username != user.username)
            userlist = [...arr, user]
            // 获取其未读消息并发送过去
            let noReadMessages = findNoReadMessages(user.username)
            setTimeout(() => {
                socket.emit('noReadMessages', noReadMessages)
            }, 50)
        })

        // 监听客户端要聊天的对象
        socket.on('IsOnline', (obj) => {
            // 查询是否在线并返回状态过去
            let res = userlist.filter(item => item.username == obj.rejector)
            socket.emit('friendStatus', res)
            // 创建本地文件夹保存后面的聊天记录
            createFile(obj)
        })

        // 监听客户端断开连接
        socket.on('disconnect', (reason) => {
            let obj = userlist.filter(item => item.userId == socket.id)
            count--
            console.log('有人撤了，当前人数：' + count + '人' + obj)
        })

        // 监听用户离开了
        socket.on('leaveout', (name) => {
            userlist = userlist.filter(item => item.username != name)
        })

        // 转发消息
        socket.on('clientMessage', function (data) {
            messageList.push(data); // 将消息记录缓存到本地
            // 找到消息的接收对象并把消息发送给对方
            let arr = userlist.filter(item => item.username == data.rejector)
            if (arr.length) {
                socket.to(arr[0].id).emit('serverMessage', data)
            }

            // 将消息记录到本地json文件中
            appendMessage(data)
        })

        // 监听客户端请求-获取历史记录
        socket.on('historyRecord', async (data) => {
            // 测试查询本地历史记录
            let hisRes = await getUserHistoryMessages(data)
            if (hisRes == '') {
                socket.emit('historyRecords', [])
            } else {
                socket.emit('historyRecords', [...JSON.parse(hisRes)])
            }
        })

        // 监听用户收到了哪条消息
        socket.on('isOk', (data) => {
            // 查询本地缓存找到这条消息，然后删除
            let index = messageList.findIndex(item => {
                if (item.message == data.message && item.sender == data.sender && item.rejector == data.rejector && item.sendTime == data.sendTime) {
                    return true
                }
            })
            messageList.splice(index, 1) //删除对方已经接收的消息
        })

        // 监听用户询问，是否有当前聊天对象的历史消息
        socket.on('hasHistoryMessage', (obj) => {
            findHistoryMessage(obj, socket)
        })

        // 声明一个事件，查询当前缓存消息的接收对象，并把消息发送过去
        let findHistoryMessage = (obj, socket) => {
            // 遍历每一条消息
            messageList.forEach(item => {
                // 如果消息的发送人和接收人匹配，则找到接收人的id,将消息发送过去
                if (item.rejector == obj.rejector && item.sender == obj.sender) {
                    let p = userlist.filter(el => el.username == item.rejector)
                    if (p.length) {   //判断一下是否找到，防止服务器报错
                        socket.emit('serverMessage', item)  //给本人id发消息不行，只能发给当前访问用户
                    }
                }
            })
        }
        // 获取当前登录用户的未读消息
        let findNoReadMessages = (username) => {
            let noReadMessages = messageList.filter(item => item.rejector == username)
            return noReadMessages
        }
    })

}

module.exports = socketServer